﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Dominio;
using Persistencia;
using System.Data;
using LogicaNegocios.Exceptions;

namespace LogicaNegocios.Manager
{
    public class ParticipanteManager
    {
        #region Singleton Code

        private static ParticipanteManager _manager;

        private ParticipanteManager() { }

        public static ParticipanteManager GetManager()
        {
            if (_manager == null)
            {
                _manager = new ParticipanteManager();
            }

            return _manager;
        }

        #endregion

        public void CrearAtletaEquipo(Participante participante)
        {
            try
            {
                //Verificar que no existe un participante con el mismo nombre
                AtletaEquipoPersistencia persistencia = new AtletaEquipoPersistencia();
                Participante participanteExistente = persistencia.GetAtletaEquipo(participante.Nombre);
                if (participanteExistente != null)
                {
                    throw new AtletaEquipoException(AtletaEquipoException.ATLETA_EQUIPO_EXISTENTE);
                }

                persistencia.InsertarAtletaEquipo(participante);
            }
            catch (DataException)
            {
                throw new DBException(DBException.ERROR_DB);
            }
        }

        public void EliminarAtletaEquipo(Participante participante)
        {
            try
            {
                AtletaEquipoPersistencia persistencia = new AtletaEquipoPersistencia();
                persistencia.EliminarAtletaEquipo(participante);
            }
            catch (DataException)
            {
                throw new DBException(DBException.ERROR_DB);
            }
        }

        public void ModificarAtletaEquipoPrincipal(Participante participante)
        {
            try
            {
                //Verificar el nombre o no permitir modificarlo
                AtletaEquipoPersistencia persistencia = new AtletaEquipoPersistencia();
                persistencia.ModificarAtletaEquipoPrincipal(participante);
            }
            catch (DataException)
            {
                throw new DBException(DBException.ERROR_DB);
            }
        }

        public void ModificarAtletaEquipoDeportes(Participante participante)
        {
            try
            {
                AtletaEquipoPersistencia persistencia = new AtletaEquipoPersistencia();
                persistencia.ModificarAtletaEquipoDeportes(participante);
            }
            catch (DataException)
            {
                throw new DBException(DBException.ERROR_DB);
            }
        }

        public void AgregarAtletaEquipoComentario(int participanteId, string comentario)
        {
            try
            {
                AtletaEquipoPersistencia persistencia = new AtletaEquipoPersistencia();
                persistencia.AgregarAtletaEquipoComentario(participanteId, comentario);
            }
            catch (DataException)
            {
                throw new DBException(DBException.ERROR_DB);
            }
        }

        public void EliminarAtletaEquipoComentario(int participanteComentarioId)
        {
            try
            {
                AtletaEquipoPersistencia persistencia = new AtletaEquipoPersistencia();
                persistencia.EliminarAtletaEquipoComentario(participanteComentarioId);
            }
            catch (DataException)
            {
                throw new DBException(DBException.ERROR_DB);
            }
        }

        public void ActualizarEquiposAtletasSeguidos(int userId, int[] atletasEquiposSeguidosIds)
        {
            try
            {
                AtletaEquipoPersistencia persistencia = new AtletaEquipoPersistencia();
                persistencia.ActualizarAtletaEquipoSeguidos(userId, atletasEquiposSeguidosIds);                
            }
            catch (DataException)
            {
                throw new DBException(DBException.ERROR_DB);
            }
        }

        public void AgregarAtletaEquipoSeguidos(int usrId, List<int> lstSeguidos)
        {
            try
            {
                AtletaEquipoPersistencia persistencia = new AtletaEquipoPersistencia();
                persistencia.AgregarAtletaEquipoSeguidos(usrId, lstSeguidos);
            }
            catch (DataException)
            {
                throw new DBException(DBException.ERROR_DB);
            }

        }


        public List<Participante> GetEquiposAtletasSeguidos(string username)
        {
            try
            {
                AtletaEquipoPersistencia persistencia = new AtletaEquipoPersistencia();
                List<Participante> participantesSeguidos = persistencia.GetAtletaEquipoSeguidos(username);
                return participantesSeguidos;
            }
            catch (DataException)
            {
                throw new DBException(DBException.ERROR_DB);
            }
        }

        public List<Participante> GetAtletasEquipos()
        {
            try
            {
                AtletaEquipoPersistencia persistencia = new AtletaEquipoPersistencia();
                List<Participante> participantes = persistencia.GetAllAtletaEquipo();
                return participantes;
            }
            catch (DataException)
            {
                throw new DBException(DBException.ERROR_DB);
            }
        }

        public Participante GetAtletaEquipo(int id)
        {
            try
            {
                AtletaEquipoPersistencia persistencia = new AtletaEquipoPersistencia();
                Participante participante = persistencia.GetAtletaEquipo(id);
                return participante;
            }
            catch (DataException)
            {
                throw new DBException(DBException.ERROR_DB);
            }
        }

        public List<Participante> GetAtletasEquiposByDeporte(int deporteId)
        {
            try
            {
                AtletaEquipoPersistencia persistencia = new AtletaEquipoPersistencia();
                List<Participante> participantes = persistencia.GetAtletasEquipsoByDeporte(deporteId);
                return participantes;
            }
            catch (DataException)
            {
                throw new DBException(DBException.ERROR_DB);
            }
        }

        public List<Pais> GetPaises()
        {
            try
            {
                AtletaEquipoPersistencia persistencia = new AtletaEquipoPersistencia();
                List<Pais> paises = persistencia.GetPaises();
                return paises;
            }
            catch (DataException)
            {
                throw new DBException(DBException.ERROR_DB);
            }
        }
    }
}
